AnsibleでCSVファイルから参照したパスワードでプロビジョニングする
本日、2本目のエントリーとなる渡辺です。
先ほどのエントリー(AnsibleによるIAMユーザの管理)では、IAM User/Groupを管理するiamモジュールを紹介しました。 その中でパスワードを扱う場合、valutを利用すると、サラりと紹介しました。 ところが、正直なところあまりvalutを使いたくありません。 編集する時もansibleを流す時にも、valutパスワードを入力するのが億劫なのです。
というわけで、lookupのcsvfileを使用し、パスワードを外部CSVファイルで管理する方法を紹介します。
外部ファイルを参照するlookup
Ansibleのlookup
は、Ansibleから外部リソースを参照するための機能です。
テキストファイルやテンプレートを参照し、Ansibleのタスクに変数のように埋め込むことができます。
tasks: - debug: msg="{{ lookup('file', '/etc/foo.txt') }}"
参照するファイルはリモートマシンではなく、ローカルマシンであることがポイントです。 Ansibleのプロジェクト配下以外からでもファイルを参照できるため、ローカルマシンにある秘密鍵などにアクセスすることも可能です。
CSVファイルのlookup
lookup
の1つ目の引数にcsvfile
を指定することで、CSVファイルを参照し、任意の行の任意のカラムの値を参照することができます。
tasks: - debug: msg="{{ lookup('csvfile', 'KEY file=password.csv delimiter=,') }}"
第2引数はスペース区切りでパラメータを指定します。 はじめのパラメータは、CSVファイルの何行目から値を取得するかを特定するためのキーです。
CSVファイルでは1つ目のカラムがキーとなっている必要があります。 例えば、次のCSVファイルでは1つ目のカラムがユーザ名です。
NAME,PASSWORD watanabe,pass1234 tanaka,pass5678
したがって、ユーザ名「watanabe」のパスワードを参照するには次のように指定します。
tasks: - debug: msg="{{ lookup('csvfile', 'watanabe file=password.csv delimiter=,') }}"
KEYの後ろにはスペース区切りで、オプション=値を指定します。
必須となるオプションはファイル名(file
)です。
CSVのデリミタのデフォルトはタブなので、カンマ区切りの場合はdelimiter
を指定してください。
また、デフォルトで参照する値は2つ目のカラムです。
参照するカラムを変更する場合は、col
オプションを指定してください。
col
は0開始のインデックスなので、3つ目のカラムを指定する場合は、col=2
となるので注意しましょう(デフォルトは1)。
その他のオプションはドキュメントを参照してください。
パスワードをCSVから参照して設定する
というわけで、iamモジュールを利用してパスワードを設定するPlaybookです。 グループ変数ではパスワードを管理せず、パスワードを外部CSVファイルから参照しています。
- hosts: localhost connection: local gather_facts: False vars: profile: default iam_users: - name: user1 - name: user2 tasks: - iam: iam_type: user name: "{{ item.name }}" state: present password: "{{ lookup('csvfile', item.name + ' file=password.csv delimiter=,') }}" profile: "{{ profile }}" with_items: "{{ iam_users }}"
NAME,PASSWORD user1,pass1234 user2,pass5678
まとめ
Ansibleの定義ファイルにパスワードなどは含めたくありません。 しかし、valutを使うのは敷居が高いかと思います。
このような場合、lookupを利用し、外部定義ファイルから値を参照すると便利です。 外部定義ファイルはそのままパスワード一覧として利用できるでしょう。